package MyStackByArray;

import java.util.Arrays;

//利用数组实现一个栈
//栈的特性就是先入后出，后入先出
public class MyStack {
    //首先需要一个数组，一个变量来标记栈顶，一个变量来表示栈的初始大小
    private int[] array;
    private int usedSize;
    private static final int Default_size = 10;
    public MyStack() {
        array = new int[Default_size];
        usedSize = 0;
    }

    //首先实现入栈操作
    public void push(int x) {
        //首先判断栈是否是满的
        if(isFull()){
            //扩容
            grow();
        }
        array[usedSize] = x;
        usedSize++;
    }

    private void grow(){
        array = Arrays.copyOf(array,array.length * 2);
    }

    //判断栈是否为满
    private boolean isFull(){
        return usedSize == array.length;
    }

    //删除数据
    public int pop(){
        //判断栈是否为空
        if(isEmpty()){
            throw new StackBoundsException("栈为空异常,无法删除");
        }
        int result = array[usedSize - 1];
        usedSize--;
        return result;
    }

    //获取栈顶元素 但是不删除当前元素
    public int peek(){
        //判断栈是否为空
        if(isEmpty()){
            throw new StackBoundsException("栈为空异常,无法取值");
        }
        return array[usedSize - 1];
    }

    //获取栈帧长度(存放有效数据的个数)
    public int size(){
        return usedSize;
    }

    public boolean isEmpty(){
        return usedSize == 0;
    }

    @Override
    public String toString() {
        int[] cur = Arrays.copyOf(array, usedSize);
        return '{' + Arrays.toString(cur) + '}';
    }
}
